package com.gjt;

import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;

/**
 * Created with Intel IDEA.
 * UDP 的 事件客户端
 * @Auther: gjt
 * @Date: 2024/10/27 10:14
 */
//@Log
public class DaytimeUDPClient {
    //    private final static int PORT = 123;
//    private static final String HOST = "time.nist.gov";
    private final static int PORT = 13;
    private static final String HOST = "172.20.10.2";


    /**
     *   字节值解析
     * 0x1B 的二进制表示为 00011011，可以分解为：
     * LI (2 位)：00 表示没有闰秒警告。
     * VN (3 位)：011 表示 NTP 版本 3。
     * Mode (3 位)：011 表示客户端模式。
     * 详细解释
     * Leap Indicator (LI)：
     * 00：没有闰秒警告。
     * 01：最后一个分钟有 61 秒。
     * 10：最后一个分钟有 59 秒。
     * 11：报警状态（时钟不可信）。
     * Version Number (VN)：
     * 000：NTP 版本 0（不常用）。
     * 001：NTP 版本 1（不常用）。
     * 010：NTP 版本 2（不常用）。
     * 011：NTP 版本 3（常用）。
     * 100：NTP 版本 4（常用）。
     * Mode：
     * 000：保留。
     * 001：对称主动模式。
     * 010：对称被动模式。
     * 011：客户端模式。
     * 100：服务器模式。
     * 101：广播模式。
     * 110：控制模式。
     * 111：私有模式。.
     */
    public static void main(String[] args) {
        try(DatagramSocket socket =  new DatagramSocket(0);) {
            socket.setSoTimeout(5000);

            InetAddress host = InetAddress.getByName(HOST);

            byte[] request1 = new byte[48];
            request1[0] = 0x1B; // LI = 0 (no warning), VN = 3 (IPv4 only), Mode = 3 (client)
            DatagramPacket request = new DatagramPacket(request1, request1.length, host, PORT);
            DatagramPacket response = new DatagramPacket(new byte[1024], 1024);

            socket.send(request);
            socket.receive(response);
            String result = new String(response.getData(),0, response.getLength(), "UTF-8");
            System.out.println(result);

        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }


//    private static final Logger log = Logger.getLogger("jini");
//    private static final String HOST = "time.nist.gov";
//    private static final int PORT = 123; // NTP 协议的标准端口号
//    private static final int NTP_PACKET_SIZE = 48;
//    private static final int NTP_TIMESTAMP_OFFSET = 40;
//    private static final long NTP_EPOCH_OFFSET = 2208988800L; // 1970-01-01 to 1900-01-01 in seconds
//
//    public static void main(String[] args) {
//        try (DatagramSocket socket = new DatagramSocket()) {
//            socket.setSoTimeout(10000); // 设置超时时间为 10 秒
//            InetAddress host = InetAddress.getByName(HOST);
//
//            // 创建 NTP 请求数据包
//            byte[] request = new byte[NTP_PACKET_SIZE];
////            request[0] = 0x1B; // LI = 0 (no warning), VN = 3 (IPv4 only), Mode = 3 (client)
//            DatagramPacket requestPacket = new DatagramPacket(request, request.length, host, PORT);
//            log.info("发送请求数据包");
//
//            // 创建响应数据包
//            byte[] response = new byte[NTP_PACKET_SIZE];
//            DatagramPacket responsePacket = new DatagramPacket(response, response.length);
//
//            // 发送请求
//            socket.send(requestPacket);
//            log.info("请求已发送，等待响应");
//
//            // 接收响应
//            socket.receive(responsePacket);
//            log.info("收到响应数据包");
//
//            // 处理响应数据
//            String result = new String(responsePacket.getData(),0, responsePacket.getLength(), "UTF-8");
//            System.out.println(result);
//            } catch (IOException e) {
//            e.printStackTrace();
//        }
//    }


}
